L’ACM permet d’explorer les relations entre plusieurs variables qualitatives en projetant les individus et les modalités dans un espace de faible dimension. Elle est souvent utilisée pour analyser des questionnaires et des tableaux de contingence complexes.
Principaux résultats d’une ACM
Inertie totale
Mesure la dispersion des données et est donnée par :
où \(\lambda_k\) sont les valeurs propres et \(q\) est le nombre total de modalités.
Valeurs propres \(\lambda_k\)
Elles indiquent la variance expliquée par chaque axe factoriel. Plus une valeur propre est élevée, plus l’axe correspondant est important dans l’analyse.
Rapports de corrélation \(\eta^2\)
Le rapport de corrélation \(\eta^2\) mesure la liaison entre une variable et un axe factoriel :
où $f_i $ est la fréquence de l’individu/modalité $i $, et \(d_{i,k}\)est sa distance à l’axe \(k\) .
Coordonnées des individus et modalités
Elles sont obtenues à partir des vecteurs propres et permettent la représentation graphique des données :
\(C_{i,k} = \frac{v_{i,k}}{\sqrt{\lambda_k}}\)
où \(v_{i,k}\) est le vecteur propre associé à l’axe \(k\).
Cos² (Qualité de représentation)
Indique dans quelle mesure un point est bien représenté sur un axe donné. Une valeur proche de **1** signifie que la projection sur cet axe est pertinente.
Contributions
Elles mesurent l’importance d’une modalité ou d’un individu dans la construction d’un axe. Plus une contribution est élevée, plus l’élément joue un rôle important dans l’interprétation de l’axe.
# Extract coordinates for dimension 2coord_dim2_modalites <- acm2_fm$var$coord[, 2]# Create a table associating the modalities and their coordinates in dimension 2modalites_coord <-data.frame(Modalite = modalites_names, Coord_Dim2 = coord_dim2_modalites)# Keep only the two necessary columnsmodalites_coord_selected <- modalites_coord[, c("Modalite", "Coord_Dim2")]print(modalites_coord_selected)
# Initialize a vector to store the index of each individualra_data$indice_culturel <-0# Browse each individualfor (i in1:nrow(ra_data)) {# Initialize individual's index to 0 indice_individu <-0# Browse each practice column (columns 3 to 27)for (pratique in3:27) {# Retrieve the individual's response for this practice (0 or 1) reponse <- ra_data[i, pratique]# If the answer is 1, add the coordinate of the corresponding modality to the index.if (reponse ==1) {# Create the modality name (e.g. “knitting_1” or “knitting_0”) nom_modalite_1 <-paste0(names(ra_data)[pratique], "_1") nom_modalite_0 <-paste0(names(ra_data)[pratique], "_0")# Find the coordinate associated with the corresponding modalityif (nom_modalite_1 %in% modalites_coord$Modalite) { indice_individu <- indice_individu + modalites_coord$Coord_Dim2[modalites_coord$Modalite == nom_modalite_1] }if (nom_modalite_0 %in% modalites_coord$Modalite) { indice_individu <- indice_individu + modalites_coord$Coord_Dim2[modalites_coord$Modalite == nom_modalite_0] } } }# Assign the calculated index to the individual ra_data$indice_culturel[i] <- indice_individu}####Normalisation# Calculate minimum and maximum index valuesmin_indice <-min(ra_data$indice_culturel, na.rm =TRUE)max_indice <-max(ra_data$indice_culturel, na.rm =TRUE)# Normalize indexra_data$indice_culturel_normalise <- (ra_data$indice_culturel - min_indice) / (max_indice - min_indice)# Check resultshead(ra_data[, c("indice_culturel", "indice_culturel_normalise")])
Notre indice est donc construit de la façon suivante:
\[I_{1j} = \sum_{k=1}^{Z} w_{1k} \cdot X_{k j}\]
Dans cette expression, \(I_{1j}\) désigne l’indice de l’individu \(j\), tandis que \(w_{1k}\) représente le poids associé à chaque variable culturelle \(X_{kj}\). La somme englobe toutes les variables culturelles \(Z\), ce qui nous permet de saisir l’engagement culturel global de l’individu.
code R
my_data_frame$identity<-ra_data$indice_culturel_normalisemy_data_frame$indice<-ra_data$indice_culturelggplot(my_data_frame, aes(x = identity, fill = Sex)) +geom_density(alpha =0.5) +scale_fill_manual(values =c("blue", "pink")) +labs(title ="Density of The Normalized Cultural Index by Sexe",x ="Normalized Cultural Index",y ="Density",fill ="Sexe") +theme_minimal()
data$identity<- my_data_frame$identitymy_data_frame$identity<-data$identity# List of cultural activitiescultural_activities <-c("Knitting" , "Cards_games", "Gambling" , "Cooking" , "DIY" ,"Vegetable_garden" , "Fishing_hunting" , "Collection" ,"Vehicle_custom","Making_music" ,"Diary" ,"Writing" , "Painting", "Montage" , "Pottery" , "Theater" , "Drawing" , "Dancing", "Photography" ,"Genealogy" , "Science" ,"None" ,"Video_games" ,"Library" ,"Concert")# Create a data frame to store the resultsresult_table <-data.frame(Activity =character(0), Accuracy =numeric(0))for (activity in cultural_activities) {# Perform a Probit regression for the current cultural activity model_formula <-as.formula(paste(activity, "~ identity")) model <-glm(model_formula, data = my_data_frame, family =binomial(link ="probit"))# Calculate predictions predicted <-ifelse(predict(model, type ="response") >=0.5, 1, 0)# Calculate the accuracy correct_predictions <-sum(predicted == my_data_frame[[activity]]) total_predictions <-nrow(my_data_frame) accuracy <- (correct_predictions / total_predictions) *100# Add the result to the data frame result_table <-rbind(result_table, data.frame(Activity = activity, Accuracy = accuracy))}result_table
# Préparer X_test (même traitement que pour l'entraînement)x_test <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Ornamental_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Circus + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + No_Amateur + Video_games + TV + Radio + Library + Museums + Internet + Concert, test_data)[, -1]# Prédire les probabilités sur les données de test avec le meilleur lambdapreds <-predict(cv_lasso, newx = x_test, s ="lambda.min", type ="response")# Variable cible y_test pour l'ensemble de testy_test <- test_data$SEXE# Calcul de l'AUC avec pROCroc_curve <-roc(y_test, preds)auc_value <-auc(roc_curve)print(paste("AUC:", auc_value))
[1] "AUC: 0.873070159752027"
code R
# Calculer la courbe ROCroc_curve <-roc(y_test, preds)# Afficher la courbe ROCplot(roc_curve, main ="Courbe ROC", col ="blue", lwd =2)# Optionnel : Ajouter la ligne de base (diagonale)abline(a =0, b =1, col ="red", lty =2)
code R
# Afficher les coefficients pour le meilleur lambdacoefficients <-coef(cv_lasso, s ="lambda.min")# Convertir en data.frame pour une meilleure lisibilitécoefficients_df <-as.data.frame(as.matrix(coefficients))colnames(coefficients_df) <-"Coefficient"coefficients_df$Variable <-rownames(coefficients_df)# Filtrer pour ne garder que les variables avec des coefficients non nulscoefficients_non_zero <- coefficients_df[coefficients_df$Coefficient !=0, ]# Afficher les variables gardées et leurs coefficientsprint(coefficients_non_zero)
# Exclure "(Intercept)" des coefficientscoefficients_filtered <- coefficients_non_zero[coefficients_non_zero$Variable !="(Intercept)", ]# Aligner les coefficients sur x_testcoef_vector <- coefficients_filtered$Coefficient[match(colnames(x_test), coefficients_filtered$Variable)]# Calcul des scorestest_data$score <- x_test %*% coef_vector# Normalisation des scoresmin_score <-min(test_data$score, na.rm =TRUE)max_score <-max(test_data$score, na.rm =TRUE)if (max_score > min_score) { test_data$score_normalise <- (test_data$score - min_score) / (max_score - min_score)} else { test_data$score_normalise <-0}# Visualisation avec ggplot2library(ggplot2)ggplot(test_data, aes(x = score_normalise, color = SEXE, fill = SEXE)) +geom_density(alpha =0.4) +labs(title ="Densité du Score Normalisé", x ="Score Normalisé", y ="Densité") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal()
code R
# Préparer la matrice X pour l'ensemble complet (train + test)x_full <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Ornamental_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Circus + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + No_Amateur + Video_games + TV + Radio + Library + Museums + Internet + Concert, my_data_frame)[, -1] # Exclure l'intercept# Sélectionner les variables pertinentes (identiques à celles du modèle LASSO)matched_vars <-intersect(rownames(coefficients_non_zero), colnames(x_full))x_full <- x_full[, matched_vars, drop =FALSE] # Garder uniquement les variables sélectionnées# Aligner les coefficients sur x_fullcoef_vector_full <- coefficients_filtered$Coefficient[match(colnames(x_full), coefficients_filtered$Variable)]# Calcul des scores pour l'ensemble completmy_data_frame$score <- x_full %*% coef_vector_full# Normalisation des scoresmin_score_full <-min(my_data_frame$score, na.rm =TRUE)max_score_full <-max(my_data_frame$score, na.rm =TRUE)if (max_score_full > min_score_full) { my_data_frame$score_normalise <- (my_data_frame$score - min_score_full) / (max_score_full - min_score_full)} else { my_data_frame$score_normalise <-0}# Visualisation du score normalisé pour l'ensemble complet avec ggplot2library(ggplot2)ggplot(my_data_frame, aes(x = score_normalise, color = SEXE, fill = SEXE)) +geom_density(alpha =0.4) +labs(title ="Densité du Score Normalisé (Ensemble Complet)", x ="Score Normalisé", y ="Densité") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal()
1.2 Comparaisons
code R
# Calculer la corrélation entre indice_normalise et score_normalisecorrelation_value <-cor(my_data_frame$identity, my_data_frame$score_normalise, use ="complete.obs")print(paste("Corrélation entre indice_normalise et score_normalise :", correlation_value))
[1] "Corrélation entre indice_normalise et score_normalise : -0.645386557366119"
code R
# Visualiser la relation entre indice_normalise et score_normaliselibrary(ggplot2)ggplot(my_data_frame, aes(x = identity, y = score_normalise)) +geom_point(alpha =0.5) +labs(title ="Relation entre indice_normalise et score_normalise", x ="Indice Normalisé", y ="Score Normalisé") +theme_minimal() +geom_smooth(method ="lm", col ="red", se =FALSE) # Ajouter une droite de régression linéaire
code R
n_2 <-nrow(my_data_frame)# Indices pour la division (2/3 pour l'entraînement, 1/3 pour le test)train_index <-sample(1:n_2, size =2* n_2 /3) # 2/3 des indices pour l'entraînement# Créer l'ensemble d'entraînement et l'ensemble de testtrain_data <- my_data_frame[train_index, ] # Enregistrement d'entraînementtest_data <- my_data_frame[-train_index, ] # Enregistrement de test# Vérifier les taillescat("Nombre d'observations dans l'ensemble d'entraînement :", nrow(train_data), "\n")
Nombre d'observations dans l'ensemble d'entraînement : 6156
code R
cat("Nombre d'observations dans l'ensemble de test :", nrow(test_data), "\n")
Nombre d'observations dans l'ensemble de test : 3078
code R
# Charger les bibliothèques nécessaireslibrary(glmnet)library(pROC)# Définir la matrice X pour l'entraînementx_2 <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + Video_games + Library + Concert, train_data)[, -1]# Variable cible y pour l'entraînementy_2 <- train_data$SEXE# Ajuster le modèle LASSO avec validation croiséecv_lasso_2 <-cv.glmnet(x_2, y_2, alpha =1, family ="binomial")best_lambda_2 <- cv_lasso_2$lambda.min # Lambda optimal# Vérifie les coefficients pour le lambda optimalprint(coef(cv_lasso_2, s ="lambda.min"))
# Préparer X_test (même traitement que pour l'entraînement)x_test_2 <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + Video_games + Library + Concert, test_data)[, -1]# Prédire les probabilités sur les données de test avec le meilleur lambdapreds_2 <-predict(cv_lasso_2, newx = x_test_2, s ="lambda.min", type ="response")# Variable cible y_test pour l'ensemble de testy_test_2 <- test_data$SEXE# Calcul de l'AUC avec pROCroc_curve_2 <-roc(y_test_2, preds_2)auc_value_2 <-auc(roc_curve_2)print(paste("AUC:", auc_value_2))
[1] "AUC: 0.868197882559135"
code R
# Calculer la courbe ROCroc_curve_2 <-roc(y_test_2, preds_2)# Afficher la courbe ROCplot(roc_curve_2, main ="Courbe ROC 2", col ="blue", lwd =2)# Optionnel : Ajouter la ligne de base (diagonale)abline(a =0, b =1, col ="red", lty =2)
code R
# Afficher les coefficients pour le meilleur lambdacoefficients_2 <-coef(cv_lasso_2, s ="lambda.min")# Convertir en data.frame pour une meilleure lisibilitécoefficients_df_2 <-as.data.frame(as.matrix(coefficients_2))colnames(coefficients_df_2) <-"Coefficient"coefficients_df_2$Variable <-rownames(coefficients_df_2)# Filtrer pour ne garder que les variables avec des coefficients non nulscoefficients_non_zero_2 <- coefficients_df_2[coefficients_df_2$Coefficient !=0, ]# Afficher les variables gardées et leurs coefficientsprint(coefficients_non_zero_2)
###CREATION INDICE# Récupérer les coefficients du modèle pour le meilleur lambdacoefficients_2 <-coef(cv_lasso_2, s ="lambda.min")# Convertir en data.frame et filtrer les variables non nullescoefficients_df_2 <-as.data.frame(as.matrix(coefficients_2))colnames(coefficients_df_2) <-"Coefficient"coefficients_df_2$Variable <-rownames(coefficients_df_2)coefficients_non_zero_2 <- coefficients_df_2[coefficients_df_2$Coefficient !=0, ]# Préparer la matrice X des pratiques pour l'ensemble de test (ou d'entraînement si nécessaire)x_test_2 <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + Video_games + Library + Concert, test_data)[, -1] # Assurez-vous d'enlever l'intercept avec [, -1]# Sélectionner les variables pertinentesmatched_vars_2 <-intersect(rownames(coefficients_non_zero_2), colnames(x_test_2))x_test_2 <- x_test_2[, matched_vars_2, drop =FALSE]coef_vector_2 <- coefficients_non_zero_2$Coefficient[matched_vars_2] # Associer les coefficients#print(paste("Dimension de x_test :", dim(x_test)[1], "x", dim(x_test)[2]))#print(paste("Longueur de coef_vector :", length(coef_vector)))#print(paste("Nombre de valeurs NA dans x_test :", sum(is.na(x_test))))#print(paste("Nombre de valeurs NA dans coef_vector :", sum(is.na(coef_vector))))#print("Variables dans coefficients_non_zero :")#print(coefficients_non_zero$Variable)#print("Colonnes de x_test :")#print(colnames(x_test))# Exclure "(Intercept)" des coefficientscoefficients_filtered_2 <- coefficients_non_zero_2[coefficients_non_zero_2$Variable !="(Intercept)", ]# Aligner les coefficients sur x_testcoef_vector_2 <- coefficients_filtered_2$Coefficient[match(colnames(x_test_2), coefficients_filtered_2$Variable)]# Calcul des scorestest_data$score_2 <- x_test_2 %*% coef_vector_2# Normalisation des scoresmin_score_2 <-min(test_data$score_2, na.rm =TRUE)max_score_2 <-max(test_data$score_2, na.rm =TRUE)if (max_score_2 > min_score_2) { test_data$score_normalise_2 <- (test_data$score_2 - min_score_2) / (max_score_2 - min_score_2)} else { test_data$score_normalise_2 <-0}# Visualisation avec ggplot2library(ggplot2)ggplot(test_data, aes(x = score_normalise_2, color = SEXE, fill = SEXE)) +geom_density(alpha =0.4) +labs(title ="Densité du Score Normalisé 2", x ="Score Normalisé 2", y ="Densité") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal()
code R
# Préparer la matrice X pour l'ensemble complet (train + test)x_full_2 <-model.matrix(SEXE ~ Knitting + Cards_games + Gambling + Cooking + DIY + Vegetable_garden + Fishing_hunting + Collection + Vehicle_custom + Making_music + Diary + Writing + Painting + Montage + Pottery + Theater + Drawing + Dancing + Photography + Genealogy + Science + None + Video_games + Library + Concert, my_data_frame)[, -1] # Exclure l'intercept# Sélectionner les variables pertinentes (identiques à celles du modèle LASSO)matched_vars_2 <-intersect(rownames(coefficients_non_zero_2), colnames(x_full_2))x_full_2 <- x_full_2[, matched_vars_2, drop =FALSE] # Garder uniquement les variables sélectionnées# Aligner les coefficients sur x_fullcoef_vector_full_2 <- coefficients_filtered_2$Coefficient[match(colnames(x_full_2), coefficients_filtered_2$Variable)]# Calcul des scores pour l'ensemble completmy_data_frame$score_2 <- x_full_2 %*% coef_vector_full_2# Normalisation des scoresmin_score_full_2 <-min(my_data_frame$score_2, na.rm =TRUE)max_score_full_2 <-max(my_data_frame$score_2, na.rm =TRUE)if (max_score_full_2 > min_score_full_2) { my_data_frame$score_normalise_2 <- (my_data_frame$score_2 - min_score_full_2) / (max_score_full_2 - min_score_full_2)} else { my_data_frame$score_normalise_2 <-0}# Visualisation du score normalisé pour l'ensemble complet avec ggplot2library(ggplot2)ggplot(my_data_frame, aes(x = score_normalise_2, color = SEXE, fill = SEXE)) +geom_density(alpha =0.4) +labs(title ="Densité du Score Normalisé 2(Ensemble Complet)", x ="Score Normalisé", y ="Densité") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal()
code R
# Calculer la corrélation entre indice_normalise et score_normalisecorrelation_value_2 <-cor(my_data_frame$identity, my_data_frame$score_normalise_2, use ="complete.obs")print(paste("Corrélation entre indice_normalise et score_normalise 2:", correlation_value))
[1] "Corrélation entre indice_normalise et score_normalise 2: -0.645386557366119"
code R
# Visualiser la relation entre indice_normalise et score_normaliselibrary(ggplot2)ggplot(my_data_frame, aes(x = identity, y = score_normalise_2)) +geom_point(alpha =0.5) +labs(title ="Relation entre indice_normalise et score_normalise 2", x ="Indice Normalisé", y ="Score Normalisé") +theme_minimal() +geom_smooth(method ="lm", col ="red", se =FALSE) # Ajouter une droite de régression linéaire
code R
# Créer un data frame pour stocker les résultatsresult_table_score_2 <-data.frame(Activity_2 =character(0), Accuracy_2 =numeric(0))cultural_activities_2 <-c("Knitting", "Cards_games", "Gambling", "Cooking", "DIY","Vegetable_garden", "Fishing_hunting", "Collection", "Vehicle_custom","Making_music", "Diary", "Writing", "Painting", "Montage","Pottery", "Theater", "Drawing", "Dancing", "Photography","Genealogy", "Science", "None", "Video_games", "Library", "Concert")for (activity_2 in cultural_activities_2) {# Effectuer une régression Probit pour l'activité culturelle actuelle model_formula_2 <-as.formula(paste(activity_2, "~ score_normalise_2")) model_2 <-glm(model_formula_2, data = my_data_frame, family =binomial(link ="probit"))# Calculer les prédictions predicted_2 <-ifelse(predict(model_2, type ="response") >=0.5, 1, 0)# Calculer la précision correct_predictions_2 <-sum(predicted_2 == my_data_frame[[activity_2]]) total_predictions_2 <-nrow(my_data_frame) accuracy_2 <- (correct_predictions_2 / total_predictions_2) *100# Ajouter le résultat au data frame result_table_score_2 <-rbind(result_table_score_2, data.frame(Activity_2 = activity_2, Accuracy_2 = accuracy_2))}# Afficher le tableau des résultatsprint(result_table_score_2)
# Proportions de 'score_scale' par genretable_score_gender <-table(my_data_frame$score_scale, my_data_frame$Sex)table_score_gender_percent <-prop.table(table_score_gender, 2) *100# Calcul par genretable_score_gender_percent
Men Women
Very Masculine 0.43248438 0.00000000
1 9.73089861 0.29574132
2 44.95434887 8.12302839
3 39.86064392 40.91088328
4 4.54108602 32.45268139
5 0.45651129 15.61514196
Very Feminine 0.02402691 2.60252366
code R
# Proportions de 'satisfaction' par genretable_satisfaction_gender <-table(my_data_frame$satisfaction, my_data_frame$Sex)table_satisfaction_gender_percent <-prop.table(table_satisfaction_gender, 2) *100# Calcul par genretable_satisfaction_gender_percent
Men Women
High 35.15399 32.66917
Low 35.80366 39.75143
Medium 29.04235 27.57940
code R
# Charger les bibliothèques nécessaireslibrary(ggplot2)library(plotly)library(scales)# Création du graphique avec ggplotp <-ggplot(as.data.frame(table_score_gender_percent), aes(x = Var1, y = Freq, fill = Var2, text =paste0("Proportion: ", percent(Freq /100)))) +geom_bar(stat ="identity", position ="dodge") +scale_fill_manual(values =c("blue", "pink")) +labs(title ="Répartition des scores par genre",x ="Score (1-7)", y ="Proportion (%)") +scale_y_continuous(labels =percent_format(scale =1)) +theme_minimal() +theme(legend.title =element_blank())# Convertir en graphique interactif avec ggplotlyggplotly(p, tooltip ="text")
# Proportions de 'score_scale' par genretable_identity_gender <-table(my_data_frame$identity_scale, my_data_frame$Sex)table_identity_gender_percent <-prop.table(table_identity_gender, 2) *100# Calcul par genretable_identity_gender_percent
Men Women
Very Feminine 0.21624219 4.29810726
1 9.68284479 29.69242902
2 51.39356079 52.62223975
3 23.66650649 11.35646688
4 12.22969726 1.77444795
5 2.30658337 0.19716088
Very Masculine 0.50456511 0.05914826
code R
# Création du graphique avec ggplotp <-ggplot(as.data.frame(table_identity_gender_percent), aes(x = Var1, y = Freq, fill = Var2, text =paste0("Proportion: ", percent(Freq /100)))) +geom_bar(stat ="identity", position ="dodge") +scale_fill_manual(values =c("blue", "pink")) +labs(title ="Répartition de l'identity scale par genre",x ="Score (1-7)", y ="Proportion (%)") +scale_y_continuous(labels =percent_format(scale =1)) +theme_minimal() +theme(legend.title =element_blank())# Convertir en graphique interactif avec ggplotlyggplotly(p, tooltip ="text")
# Proportions de 'score_scale' par professiontable_identity_gender <-table(my_data_frame$CLASSIF, my_data_frame$score_scale)table_identity_gender_percent <-prop.table(table_identity_gender, 2) *100# Calcul par genretable_identity_gender_percent
# Création du graphique avec ggplotp <-ggplot(as.data.frame(table_identity_gender_percent), aes(x = Var1, y = Freq, fill = Var2, text =paste0("Proportion: ", percent(Freq /100)))) +geom_bar(stat ="identity", position ="dodge") +labs(title ="Répartition des professions par score scale",x ="Profession", y ="Proportion (%)") +scale_y_continuous(labels =percent_format(scale =1)) +theme_minimal() +theme(legend.title =element_blank())# Convertir en graphique interactif avec ggplotlyggplotly(p, tooltip ="text")
code R
library(ggplot2)library(dplyr)library(plotly)# Créer un tableau de fréquence pour la heatmapheatmap_data <- my_data_frame %>%count(score_scale, satisfaction) # Compte les occurrences# Ajouter une colonne pour l'affichage interactifheatmap_data <- heatmap_data %>%mutate(info_text =paste0("Score: ", score_scale, "\nSatisfaction: ", satisfaction, "\nNombre d'observations: ", n))# Créer la heatmap avec ggplotp <-ggplot(heatmap_data, aes(x =as.factor(score_scale), y =as.factor(satisfaction), fill = n, text = info_text)) +geom_tile() +scale_fill_gradient(low ="white", high ="blue") +labs(title ="Heatmap de la relation entre satisfaction et score",x ="Score Scale", y ="Satisfaction", fill ="Fréquence") +theme_minimal()# Rendre le graphique interactif avec des infobulles personnaliséesggplotly(p, tooltip ="text")
code R
# Créer un tableau de fréquence pour la heatmapheatmap_data <- my_data_frame %>%count(identity_scale, satisfaction) # Compte les occurrences# Ajouter une colonne pour l'affichage interactifheatmap_data <- heatmap_data %>%mutate(info_text =paste0("Identity: ", identity_scale, "\nSatisfaction: ", satisfaction, "\nNombre d'observations: ", n))# Créer la heatmap avec ggplotp <-ggplot(heatmap_data, aes(x =as.factor(identity_scale), y =as.factor(satisfaction), fill = n, text = info_text)) +geom_tile() +scale_fill_gradient(low ="white", high ="blue") +labs(title ="Heatmap de la relation entre satisfaction et identity scale",x ="Score Scale", y ="Satisfaction", fill ="Fréquence") +theme_minimal()# Rendre le graphique interactif avec des infobulles personnaliséesggplotly(p, tooltip ="text")
1.3 Ecarts aux normes et satisfaction
code R
mean_gender <-tapply(my_data_frame$identity, my_data_frame$Sex, mean)sd_gender <-tapply(my_data_frame$identity, my_data_frame$Sex, sd)my_data_frame$distance_abs<-abs((my_data_frame$identity - mean_gender[my_data_frame$Sex]) / sd_gender[my_data_frame$Sex])ggplot(my_data_frame, aes(x = distance_abs, color = Sex, fill = Sex)) +geom_density(alpha =0.4) +labs(title ="Density of Distance to the Norm, by Sex", x ="Distance to the Norm (Z-score)", y ="Density") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal()
code R
# Charger dplyrlibrary(dplyr)# Assurer que Sex est un facteur avec les niveaux appropriésmy_data_frame$Sex <-factor(my_data_frame$Sex, levels =c("Men", "Women"))# Calculer les moyennes et écarts-types par sexe avec dplyrmean_sd_by_sex <- my_data_frame %>%group_by(Sex) %>%summarise(mean_gender =mean(score_normalise, na.rm =TRUE),sd_gender =sd(score_normalise, na.rm =TRUE) )# Joindre les moyennes et écarts-types au dataframe originalmy_data_frame <- my_data_frame %>%left_join(mean_sd_by_sex, by ="Sex")# Calculer la distance absolue à la moyenne (Z-score)my_data_frame <- my_data_frame %>%mutate(distance_abs_2 =abs((score_normalise - mean_gender) / sd_gender))# Visualisationggplot(my_data_frame, aes(x = distance_abs_2, color = Sex, fill = Sex)) +geom_density(alpha =0.4) +labs(title ="Density of Distance to the Norm (Score), by Sex", x ="Distance to the Norm (Z-score)", y ="Density") +scale_fill_manual(values =c("blue", "pink")) +scale_color_manual(values =c("blue", "pink")) +theme_minimal() +geom_vline(data = my_data_frame, aes(xintercept =mean(distance_abs_2[Sex =="Men"]), color ="Men"), linetype ="dashed") +geom_vline(data = my_data_frame, aes(xintercept =mean(distance_abs_2[Sex =="Women"]), color ="Women"), linetype ="dashed") +theme(legend.title =element_blank()) # Enlever le titre de la légende
code R
# Charger le package MASS pour polrlibrary(MASS)# Modèle de régression ordinale (polr)model <-polr(as.factor(satisfaction) ~ distance_abs_2, data = my_data_frame, method ="logistic")# Résumé du modèlesummary(model)
Call:
polr(formula = as.factor(satisfaction) ~ distance_abs_2, data = my_data_frame,
method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 0.02273 0.03199 0.7105
Intercepts:
Value Std. Error t value
High|Low -0.6543 0.0340 -19.2524
Low|Medium 0.9511 0.0348 27.3139
Residual Deviance: 20135.53
AIC: 20141.53
(9 observations effacées parce que manquantes)
code R
# Modèle de régression ordinale avec interaction entre sexe et distance aux normesmodel_interaction <-polr(as.factor(satisfaction) ~ Sex * distance_abs_2, data = my_data_frame, method ="logistic")# Résumé du modèlesummary(model_interaction)
Call:
polr(formula = as.factor(satisfaction) ~ Sex * distance_abs_2,
data = my_data_frame, method = "logistic")
Coefficients:
Value Std. Error t value
SexWomen 0.11297 0.06463 1.748
distance_abs_2 0.07744 0.04621 1.676
SexWomen:distance_abs_2 -0.10629 0.06407 -1.659
Intercepts:
Value Std. Error t value
High|Low -0.5961 0.0477 -12.4889
Low|Medium 1.0098 0.0486 20.7948
Residual Deviance: 20132.29
AIC: 20142.29
(9 observations effacées parce que manquantes)
code R
# Charger la bibliothèque Plotlylibrary(plotly)# Regroupement de distance_abs_2 en catégories (bins)my_data_frame$distance_abs_2_bins <-cut(my_data_frame$distance_abs_2, breaks =10, # Divise en 10 intervalleslabels =FALSE, include.lowest =TRUE)# Comptage des occurrences pour chaque combinaison de Sexe, Satisfaction et Distancelibrary(dplyr)count_data <- my_data_frame %>%count(Sex, satisfaction, distance_abs_2_bins)# Création de la heatmap interactive avec Plotlyfig <-plot_ly(count_data, x =~distance_abs_2_bins, y =~as.factor(satisfaction), z =~n, type ="heatmap", colors =colorRamp(c("white", "blue")), colorbar =list(title ="Nombre d'individus"))# Ajouter des titresfig <- fig %>%layout(title ="Heatmap de Satisfaction par Sexe et Distance aux Normes",xaxis =list(title ="Distance aux Normes (Binned)"),yaxis =list(title ="Satisfaction"))# Afficher la heatmap interactivefig
code R
ggplot(my_data_frame, aes(x = distance_abs_2, y =as.factor(satisfaction), color = Sex)) +geom_point(alpha =0.7) +labs(title ="Interaction entre Sexe et Distance aux Normes sur Satisfaction",x ="Distance aux Normes (Z-score)", y ="Satisfaction") +scale_color_manual(values =c("blue", "pink")) +theme_minimal() +facet_wrap(~Sex)
code R
# 1. Charger les librairies nécessaireslibrary(MASS)library(ggplot2)# 2. Vérifier les valeurs manquantes dans le dataframe#summary(my_data_frame)# 3. Supprimer les lignes contenant des valeurs manquantes dans les colonnes pertinentesmy_data_frame_clean <- my_data_frame[complete.cases(my_data_frame[c("satisfaction", "Sex", "distance_abs_2")]), ]# Vérification de la taille du dataframe nettoyénrow(my_data_frame_clean) # Assure-toi que la taille est correcte
[1] 9225
code R
# 4. Convertir les variables catégoriques en facteurs avec les niveaux appropriésmy_data_frame_clean$satisfaction <-factor(my_data_frame_clean$satisfaction, levels =c("Low", "Medium", "High"))my_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))# 5. Ajuster le modèle de régression logistique ordinalemodel_clean <-polr(as.factor(satisfaction) ~ distance_abs_2, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean)
Call:
polr(formula = as.factor(satisfaction) ~ distance_abs_2, data = my_data_frame_clean,
method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 -0.09192 0.03231 -2.845
Intercepts:
Value Std. Error t value
Low|Medium -0.5649 0.0338 -16.7203
Medium|High 0.5994 0.0339 17.7059
Residual Deviance: 20127.93
AIC: 20133.93
code R
# 6. Calculer les probabilités pour chaque niveau de satisfactionpred_prob_clean <-predict(model_clean, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_high <- pred_prob_clean[, "High"]my_data_frame_clean$prob_medium <- pred_prob_clean[, "Medium"]my_data_frame_clean$prob_low <- pred_prob_clean[, "Low"]# 7. Visualiser les résultatsggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_high, color ="High"), size =1) +geom_line(aes(y = prob_medium, color ="Medium"), size =1) +geom_line(aes(y = prob_low, color ="Low"), size =1) +labs(title ="Probabilité d'être satisfait selon l'écart aux normes",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("High"="blue", "Medium"="orange", "Low"="red")) +theme_minimal()
code R
# 1. Charger les librairies nécessaireslibrary(MASS)library(ggplot2)# 2. Vérifier les valeurs manquantes dans le dataframe#summary(my_data_frame)# 3. Supprimer les lignes contenant des valeurs manquantes dans les colonnes pertinentesmy_data_frame_clean <- my_data_frame[complete.cases(my_data_frame[c("satisfaction", "Sex", "distance_abs_2")]), ]# Vérification de la taille du dataframe nettoyénrow(my_data_frame_clean) # Assure-toi que la taille est correcte
[1] 9225
code R
# 4. Convertir les variables catégoriques en facteurs avec les niveaux appropriésmy_data_frame_clean$satisfaction <-factor(my_data_frame_clean$satisfaction, levels =c("Low", "Medium", "High"))my_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))# 5. Ajuster le modèle de régression logistique ordinale avec interaction entre Sex et distance_abs_2model_clean_sex <-polr(as.factor(satisfaction) ~ distance_abs_2 * Sex, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean_sex)
Call:
polr(formula = as.factor(satisfaction) ~ distance_abs_2 * Sex,
data = my_data_frame_clean, method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 -0.11679 0.04617 -2.5298
SexWomen -0.18175 0.06454 -2.8160
distance_abs_2:SexWomen 0.05407 0.06464 0.8365
Intercepts:
Value Std. Error t value
Low|Medium -0.6607 0.0474 -13.9416
Medium|High 0.5049 0.0472 10.7040
Residual Deviance: 20114.33
AIC: 20124.33
code R
# 6. Calculer les probabilités pour chaque niveau de satisfaction par sexepred_prob_clean_sex <-predict(model_clean_sex, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_high <- pred_prob_clean_sex[, "High"]my_data_frame_clean$prob_medium <- pred_prob_clean_sex[, "Medium"]my_data_frame_clean$prob_low <- pred_prob_clean_sex[, "Low"]# 7. Visualiser les résultats en fonction de l'écart aux normes et du sexe (avec facet)ggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_high, color ="High"), size =1) +geom_line(aes(y = prob_medium, color ="Medium"), size =1) +geom_line(aes(y = prob_low, color ="Low"), size =1) +labs(title ="Probabilité d'être satisfait selon l'écart aux normes et par sexe",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("High"="blue", "Medium"="orange", "Low"="red")) +theme_minimal() +facet_wrap(~ Sex) +# Facette par Sexetheme(legend.title =element_blank()) # Enlever le titre de la légende
code R
# 1. Charger les librairies nécessaireslibrary(MASS)library(ggplot2)library(plotly)# 2. Vérifier les valeurs manquantes dans le dataframe#summary(my_data_frame)# 3. Supprimer les lignes contenant des valeurs manquantes dans les colonnes pertinentesmy_data_frame_clean <- my_data_frame[complete.cases(my_data_frame[c("satisfaction", "Sex", "distance_abs_2")]), ]# Vérification de la taille du dataframe nettoyénrow(my_data_frame_clean) # Assure-toi que la taille est correcte
[1] 9225
code R
# 4. Convertir les variables catégoriques en facteurs avec les niveaux appropriésmy_data_frame_clean$satisfaction <-factor(my_data_frame_clean$satisfaction, levels =c("Low", "Medium", "High"))my_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))# 5. Ajuster le modèle de régression logistique ordinale avec interaction entre Sex et distance_abs_2model_clean_sex <-polr(as.factor(satisfaction) ~ distance_abs_2 * Sex, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean_sex)
Call:
polr(formula = as.factor(satisfaction) ~ distance_abs_2 * Sex,
data = my_data_frame_clean, method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 -0.11679 0.04617 -2.5298
SexWomen -0.18175 0.06454 -2.8160
distance_abs_2:SexWomen 0.05407 0.06464 0.8365
Intercepts:
Value Std. Error t value
Low|Medium -0.6607 0.0474 -13.9416
Medium|High 0.5049 0.0472 10.7040
Residual Deviance: 20114.33
AIC: 20124.33
code R
# 6. Calculer les probabilités pour chaque niveau de satisfaction par sexepred_prob_clean_sex <-predict(model_clean_sex, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_high <- pred_prob_clean_sex[, "High"]my_data_frame_clean$prob_medium <- pred_prob_clean_sex[, "Medium"]my_data_frame_clean$prob_low <- pred_prob_clean_sex[, "Low"]# 7. Visualisation avec ggplot et ajout de commentaires pour les courbesp <-ggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_high, color ="High"), size =1) +geom_line(aes(y = prob_medium, color ="Medium"), size =1) +geom_line(aes(y = prob_low, color ="Low"), size =1) +labs(title ="Probabilité d'être satisfait selon l'écart aux normes et par sexe",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("High"="blue", "Medium"="orange", "Low"="red")) +theme_minimal() +facet_wrap(~ Sex) +# Facette par Sexetheme(legend.title =element_blank()) # Enlever le titre de la légende# 8. Rendre le graphique interactif avec plotly et ajouter des annotationsp_interactive <-ggplotly(p)# Ajouter des annotations pour chaque courbep_interactive <- p_interactive %>%layout(annotations =list(list(x =0.5, y =0.8, text ="Probabilité High", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ),list(x =0.5, y =0.6, text ="Probabilité Medium", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ),list(x =0.5, y =0.4, text ="Probabilité Low", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ) ) )# Afficher le graphique interactifp_interactive
code R
# 1. Charger les librairies nécessaireslibrary(MASS)library(ggplot2)library(plotly)# 2. Convertir la colonne de réponses A15 en une variable Santé catégorique (3 niveaux)# Supposons que ta variable santé est dans la colonne 'A15' de 'my_data_frame'# Remplacer les valeurs de A15 par les niveaux correspondants pour Santémy_data_frame$Santé <-factor(my_data_frame$A15,levels =c(1, 2, 3, 4, 5),labels =c("Very Good", "Good", "Fair", "Poor", "Very Poor"))# Convertir en 3 niveaux: "Good", "Fair", "Poor"my_data_frame$Santé <-factor(my_data_frame$Santé,levels =c("Very Good", "Good", "Fair", "Poor", "Very Poor"),labels =c("Good", "Good", "Fair", "Poor", "Poor"))# Exclure les réponses "Ne sait pas" (6) et "Refus" (7)my_data_frame_clean <- my_data_frame[!(my_data_frame$A15 %in%c(6, 7)), ]# 3. Vérifier que la variable Santé est correctement crééetable(my_data_frame_clean$Santé)
Good Fair Poor
6410 1998 783
code R
# 4. Convertir 'Sex' en facteurmy_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))# 5. Ajuster le modèle de régression logistique ordinale avec interaction entre Sex et distance_abs_2model_clean_sex_health <-polr(Santé ~ distance_abs_2 * Sex, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean_sex_health)
Call:
polr(formula = Santé ~ distance_abs_2 * Sex, data = my_data_frame_clean,
method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 -0.19064 0.05772 -3.3026
SexWomen 0.02624 0.07578 0.3463
distance_abs_2:SexWomen 0.21223 0.07738 2.7426
Intercepts:
Value Std. Error t value
Good|Fair 0.7948 0.0554 14.3528
Fair|Poor 2.3365 0.0628 37.2049
Residual Deviance: 14545.71
AIC: 14555.71
code R
# 6. Calculer les probabilités pour chaque niveau de Santé par sexepred_prob_clean_sex_health <-predict(model_clean_sex_health, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_poor <- pred_prob_clean_sex_health[, "Poor"]my_data_frame_clean$prob_fair <- pred_prob_clean_sex_health[, "Fair"]my_data_frame_clean$prob_good <- pred_prob_clean_sex_health[, "Good"]# 7. Visualisation avec ggplot et ajout de commentaires pour les courbesp_health <-ggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_poor, color ="Poor"), size =1) +geom_line(aes(y = prob_fair, color ="Fair"), size =1) +geom_line(aes(y = prob_good, color ="Good"), size =1) +labs(title ="Probabilité d'être en bonne santé selon l'écart aux normes et par sexe",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("Poor"="red", "Fair"="orange", "Good"="green")) +theme_minimal() +facet_wrap(~ Sex) +# Facette par Sexetheme(legend.title =element_blank()) # Enlever le titre de la légende# 8. Rendre le graphique interactif avec plotly et ajouter des annotationsp_interactive_health <-ggplotly(p_health)# Ajouter des annotations pour chaque courbep_interactive_health <- p_interactive_health %>%layout(annotations =list(list(x =0.5, y =0.8, text ="Probabilité Poor", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ),list(x =0.5, y =0.6, text ="Probabilité Fair", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ),list(x =0.5, y =0.4, text ="Probabilité Good", showarrow =TRUE, arrowhead =2,ax =-50, ay =-50 ) ) )# Afficher le graphique interactifp_interactive_health
code R
# Créer la variable revenu en fonction de CRITREVENUmy_data_frame$revenu <-NA# Initialisation de la variable# Assignation des tranches de revenumy_data_frame$revenu[my_data_frame$CRITREVENU %in%c(1, 2)] <-"Moins de 1000 euros"my_data_frame$revenu[my_data_frame$CRITREVENU %in%c(3, 4)] <-"1000 à 1499 euros"my_data_frame$revenu[my_data_frame$CRITREVENU %in%c(5, 6)] <-"1500 à 2499 euros"my_data_frame$revenu[my_data_frame$CRITREVENU %in%c(7, 8, 9, 10)] <-"2500 euros et plus"# Convertir la variable revenu en facteurmy_data_frame$revenu <-factor(my_data_frame$revenu, levels =c("Moins de 1000 euros", "1000 à 1499 euros", "1500 à 2499 euros", "2500 euros et plus"))# Vérifier les niveaux de la nouvelle variable revenusummary(my_data_frame$revenu)
Moins de 1000 euros 1000 à 1499 euros 1500 à 2499 euros 2500 euros et plus
766 1280 2241 3775
NA's
1172
code R
# Charger les librairies nécessaireslibrary(MASS)library(ggplot2)library(plotly)# 2. Vérifier les valeurs manquantes dans le dataframe#summary(my_data_frame)# 3. Supprimer les lignes contenant des valeurs manquantes dans les colonnes pertinentesmy_data_frame_clean <- my_data_frame[complete.cases(my_data_frame[c("satisfaction", "Sex", "distance_abs_2", "revenu")]), ]# Vérification de la taille du dataframe nettoyénrow(my_data_frame_clean) # Assure-toi que la taille est correcte
[1] 8057
code R
# 4. Convertir les variables catégoriques en facteurs avec les niveaux appropriésmy_data_frame_clean$satisfaction <-factor(my_data_frame_clean$satisfaction, levels =c("Low", "Medium", "High"))my_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))my_data_frame_clean$revenu <-factor(my_data_frame_clean$revenu, levels =c("Moins de 1000 euros", "1000 à 1499 euros", "1500 à 2499 euros", "2500 euros et plus"),labels =c("<1000", "[1000-1499]", "[1500-2499]", "≥2500"))# 5. Ajuster le modèle de régression logistique ordinale avec interaction entre Sexe, revenu et distance_abs_2model_clean_sex_revenu <-polr(as.factor(satisfaction) ~ distance_abs_2 * Sex * revenu, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean_sex_revenu)
# 6. Calculer les probabilités pour chaque niveau de satisfaction par sexe et revenupred_prob_clean_sex_revenu <-predict(model_clean_sex_revenu, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_high <- pred_prob_clean_sex_revenu[, "High"]my_data_frame_clean$prob_medium <- pred_prob_clean_sex_revenu[, "Medium"]my_data_frame_clean$prob_low <- pred_prob_clean_sex_revenu[, "Low"]p <-ggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_high, color ="High"), size =1) +geom_line(aes(y = prob_medium, color ="Medium"), size =1) +geom_line(aes(y = prob_low, color ="Low"), size =1) +labs(title ="Probabilité d'être satisfait selon l'écart aux normes, par Sexe et Revenu",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("High"="blue", "Medium"="orange", "Low"="red")) +theme_minimal() +facet_grid(revenu ~ Sex) +# Facet verticalement par revenu et horizontalement par sexetheme(legend.title =element_blank(),strip.text.y =element_text(size =10), # Réduire la taille des labels des facettespanel.spacing =unit(2, "lines") # Augmenter l'espacement vertical entre facettes )# Rendre interactifp_interactive <-ggplotly(p)# Afficher le graphiquep_interactive
code R
# Charger les librairies nécessaireslibrary(MASS)library(ggplot2)library(plotly)# Supprimer les lignes contenant des valeurs manquantes dans les colonnes pertinentesmy_data_frame_clean <- my_data_frame[complete.cases(my_data_frame[c("Santé", "Sex", "distance_abs_2", "revenu")]), ]# Convertir les variables catégoriques en facteurs avec les niveaux appropriésmy_data_frame_clean$Sex <-factor(my_data_frame_clean$Sex, levels =c("Men", "Women"))my_data_frame_clean$revenu <-factor(my_data_frame_clean$revenu, levels =c("Moins de 1000 euros", "1000 à 1499 euros", "1500 à 2499 euros", "2500 euros et plus"),labels =c("<1000", "[1000-1499]", "[1500-2499]", "≥2500"))# Ajuster le modèle de régression logistique ordinale avec interaction entre Sexe, revenu et distance_abs_2model_clean_sex_revenu <-polr(Santé ~ distance_abs_2 * Sex * revenu, data = my_data_frame_clean, method ="logistic")# Résumé du modèlesummary(model_clean_sex_revenu)
# Calculer les probabilités pour chaque niveau de santé par sexe et revenupred_prob_clean_sex_revenu <-predict(model_clean_sex_revenu, type ="probs")# Ajouter les probabilités au dataframe nettoyémy_data_frame_clean$prob_high <- pred_prob_clean_sex_revenu[, "Good"]my_data_frame_clean$prob_medium <- pred_prob_clean_sex_revenu[, "Fair"]my_data_frame_clean$prob_low <- pred_prob_clean_sex_revenu[, "Poor"]# Visualisation avec ggplotp <-ggplot(my_data_frame_clean, aes(x = distance_abs_2)) +geom_line(aes(y = prob_high, color ="High"), size =1) +geom_line(aes(y = prob_medium, color ="Medium"), size =1) +geom_line(aes(y = prob_low, color ="Low"), size =1) +labs(title ="Probabilité d'avoir un bon état de santé selon l'écart aux normes, par Sexe et Revenu",x ="Distance aux Normes (Z-score)",y ="Probabilité") +scale_color_manual(values =c("High"="blue", "Medium"="orange", "Low"="red")) +theme_minimal() +facet_grid(revenu ~ Sex) +# Facet verticalement par revenu et horizontalement par sexetheme(legend.title =element_blank(),strip.text.y =element_text(size =10), # Réduire la taille des labels des facettespanel.spacing =unit(2, "lines") # Augmenter l'espacement vertical entre facettes )# Rendre interactifp_interactive <-ggplotly(p)# Afficher le graphiquep_interactive
library(dplyr)# Vérifier et nettoyer la colonne Sexmy_data_frame <- my_data_frame %>%mutate(Sex =trimws(as.character(Sex)), # Supprime les espaces autour des valeursSex =case_when(tolower(Sex) =="men"~"Men", # Uniformise "men" en "Men"tolower(Sex) =="women"~"Women", # Uniformise "women" en "Women"TRUE~NA_character_# Remplace toutes les autres valeurs par NA ) ) %>%drop_na(Sex) # Supprime les lignes où Sex est NA# Séparer les donnéesdf_men <- my_data_frame %>%filter(Sex =="Men")df_women <- my_data_frame %>%filter(Sex =="Women")# Vérifier la séparationprint(dim(df_men)) # Nombre de lignes et colonnes pour les hommes
[1] 4162 1593
code R
print(dim(df_women)) # Nombre de lignes et colonnes pour les femmes
library(dplyr)library(ggplot2)library(plotly)# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(revenu, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(revenu) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~revenu, y =~proportion, color =~score_scale, type ="bar",text =~paste0(round(proportion*100, 1), "%"), textposition ="inside") %>%layout(title ="Proportion de score_scale par tranche de revenu",xaxis =list(title ="Tranche de revenu"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack") # Empilement des barresfig # Affichage du graphique interactif
code R
library(dplyr)library(ggplot2)library(plotly)# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(CLASSIF, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(CLASSIF) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~CLASSIF, y =~proportion, color =~score_scale, type ="bar",text =~paste0(round(proportion*100, 1), "%"), textposition ="inside") %>%layout(title ="Proportion de score_scale par profession",xaxis =list(title ="Profession"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack") # Empilement des barresfig # Affichage du graphique interactif
1
Manoeuvre ou ouvrier spécialisé
2
Ouvrier qualifié ou hautement qualifié/ technicien(ne) d’atelier
3
Technicien(ne)
4
Agent de maîtrise, maîtrise administrative ou commerciale, VRP (non cadre)
5
Ingénieur, Cadre
6
Employé(e) de bureau, Employé(e) de commerce, Personnel de services
7
Directeur général, Adjoint direct
8
NSP
9
REF
code R
library(dplyr)library(ggplot2)library(plotly)# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(satisfaction, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(satisfaction) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~satisfaction, y =~proportion, color =~score_scale, type ="bar",text =~paste0(round(proportion*100, 1), "%"), textposition ="inside") %>%layout(title ="Proportion de score_scale par degré de satisfaction",xaxis =list(title ="Satisfaction"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack") # Empilement des barresfig # Affichage du graphique interactif
code R
library(dplyr)library(ggplot2)library(plotly)# Convertir DIPLOM en facteurmy_data_frame$DIPLOM <-as.factor(my_data_frame$DIPLOM)# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(DIPLOM, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(DIPLOM) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Ajouter une colonne avec les descriptions des diplômesdiplome_labels <-c("Vous n'avez jamais été à l'école ou vous l'avez quittée avant la fin du primaire","Aucun diplôme et scolarité interrompue à la fin du primaire ou avant la fin du collège","Aucun diplôme et scolarité jusqu'à la fin du collège et au-delà","CEP","BEPC, brevet élémentaire, brevet des collèges, DNB","CAP, BEP ou diplôme équivalent","Baccalauréat général ou technologique, brevet supérieur","Capacité en droit, DAEU, ESEU","Baccalauréat professionnel, brevet professionnel, de technicien ou d'enseignement, diplôme équivalent","BTS, DUT, DEUST, diplôme de la santé ou social de niveau Bac+2 ou diplôme équivalent","Licence, licence pro, maîtrise ou autre diplôme de niveau Bac+3 ou 4 ou diplôme équivalent","Master, DEA, DESS, diplôme grande école de niveau Bac+5, doctorat de santé","Doctorat de recherche (hors santé)","NSP","REF")# Ajouter les libellés des diplômes à df_proportionsdf_proportions <- df_proportions %>%mutate(DIPLOM_label = diplome_labels[as.numeric(DIPLOM)])# Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~DIPLOM, y =~proportion, color =~score_scale, type ="bar",text =~paste(DIPLOM_label, "<br>", round(proportion*100, 1), "%"), # Affichage du libellé et proportiontextposition ="inside") %>%layout(title ="Proportion de score_scale par niveau de diplôme",xaxis =list(title ="Niveau de diplôme"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survolfig
code R
library(dplyr)library(ggplot2)library(plotly)# Convertir DIPLOM en facteurmy_data_frame$DIPLOM <-as.factor(my_data_frame$DIPLOM)# Création des quartiles de distance_abs_2my_data_frame <- my_data_frame %>%mutate(quartile_distance =cut(distance_abs_2, breaks =quantile(distance_abs_2, probs =c(0, 0.25, 0.5, 0.75, 1), na.rm =TRUE), include.lowest =TRUE, labels =c("Q1", "Q2", "Q3", "Q4"))) # Étiquettes des quartiles# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(DIPLOM, quartile_distance) %>%summarise(count =n(), .groups ="drop") %>%group_by(DIPLOM) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Ajouter une colonne avec les descriptions des diplômesdiplome_labels <-c("Vous n'avez jamais été à l'école ou vous l'avez quittée avant la fin du primaire","Aucun diplôme et scolarité interrompue à la fin du primaire ou avant la fin du collège","Aucun diplôme et scolarité jusqu'à la fin du collège et au-delà","CEP","BEPC, brevet élémentaire, brevet des collèges, DNB","CAP, BEP ou diplôme équivalent","Baccalauréat général ou technologique, brevet supérieur","Capacité en droit, DAEU, ESEU","Baccalauréat professionnel, brevet professionnel, de technicien ou d'enseignement, diplôme équivalent","BTS, DUT, DEUST, diplôme de la santé ou social de niveau Bac+2 ou diplôme équivalent","Licence, licence pro, maîtrise ou autre diplôme de niveau Bac+3 ou 4 ou diplôme équivalent","Master, DEA, DESS, diplôme grande école de niveau Bac+5, doctorat de santé","Doctorat de recherche (hors santé)","NSP","REF")# Ajouter les libellés des diplômes à df_proportionsdf_proportions <- df_proportions %>%mutate(DIPLOM_label = diplome_labels[as.numeric(DIPLOM)])# Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~DIPLOM, y =~proportion, color =~quartile_distance, type ="bar",text =~paste(DIPLOM_label, "<br>", round(proportion*100, 1), "%"), # Affichage du libellé et proportiontextposition ="inside") %>%layout(title ="Quartile Distance par niveau de diplôme",xaxis =list(title ="Niveau de diplôme"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survolfig
code R
library(dplyr)library(ggplot2)library(plotly)# Création des quartiles de distance_abs_2my_data_frame <- my_data_frame %>%mutate(quartile_distance =cut(distance_abs_2, breaks =quantile(distance_abs_2, probs =c(0, 0.25, 0.5, 0.75, 1), na.rm =TRUE), include.lowest =TRUE, labels =c("Q1", "Q2", "Q3", "Q4"))) # Étiquettes des quartilestable(my_data_frame$quartile_distance) # Vérification
Q1 Q2 Q3 Q4
2309 2308 2308 2309
code R
# Calcul des proportions correctes par satisfaction (A2)df_proportions <- my_data_frame %>%group_by(satisfaction, quartile_distance) %>%summarise(count =n(), .groups ="drop") %>%group_by(satisfaction) %>%# Normalisation par A2 et non par quartile_distancemutate(proportion = count /sum(count)) # Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~satisfaction, y =~proportion, color =~quartile_distance, type ="bar",text =~paste0(round(proportion *100, 1), "%"), textposition ="inside") %>%layout(title ="Proportion de distance aux normes par degré de satisfaction",xaxis =list(title ="Satisfaction"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack") # Empilement des barres pour que chaque A2 fasse 100%fig
code R
# Créer un tableau de contingencecontingency_table <-table(my_data_frame$satisfaction, my_data_frame$quartile_distance)# Test du chi-deuxchi2_test <-chisq.test(contingency_table)# Résultatschi2_test
library(ggeffects)pred <-ggeffect(model, terms ="quartile_distance")plot(pred) # Visualisation des probabilités
1.4 Diplomes et distance aux normes de genre
code R
library(dplyr)library(ggplot2)library(plotly)# Convertir DIPLOM et Sex en facteursmy_data_frame$DIPLOM <-as.factor(my_data_frame$DIPLOM)my_data_frame$Sex <-as.factor(my_data_frame$Sex)# Création des quartiles de distance_abs_2my_data_frame <- my_data_frame %>%mutate(quartile_distance =cut(distance_abs_2, breaks =quantile(distance_abs_2, probs =c(0, 0.25, 0.5, 0.75, 1), na.rm =TRUE), include.lowest =TRUE, labels =c("Q1", "Q2", "Q3", "Q4"))) # Étiquettes des quartiles# Créer un tableau de proportionsdf_proportions <- my_data_frame %>%group_by(Sex, DIPLOM, quartile_distance) %>%summarise(count =n(), .groups ="drop") %>%group_by(Sex, DIPLOM) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Ajouter une colonne avec les descriptions des diplômesdiplome_labels <-c("Vous n'avez jamais été à l'école ou vous l'avez quittée avant la fin du primaire","Aucun diplôme et scolarité interrompue à la fin du primaire ou avant la fin du collège","Aucun diplôme et scolarité jusqu'à la fin du collège et au-delà","CEP","BEPC, brevet élémentaire, brevet des collèges, DNB","CAP, BEP ou diplôme équivalent","Baccalauréat général ou technologique, brevet supérieur","Capacité en droit, DAEU, ESEU","Baccalauréat professionnel, brevet professionnel, de technicien ou d'enseignement, diplôme équivalent","BTS, DUT, DEUST, diplôme de la santé ou social de niveau Bac+2 ou diplôme équivalent","Licence, licence pro, maîtrise ou autre diplôme de niveau Bac+3 ou 4 ou diplôme équivalent","Master, DEA, DESS, diplôme grande école de niveau Bac+5, doctorat de santé","Doctorat de recherche (hors santé)","NSP","REF")# Ajouter les libellés des diplômes à df_proportionsdf_proportions <- df_proportions %>%mutate(DIPLOM_label = diplome_labels[as.numeric(DIPLOM)])# Séparer les données en deux sous-ensembles (Hommes et Femmes)df_men <- df_proportions %>%filter(Sex =="Men")df_women <- df_proportions %>%filter(Sex =="Women")# Graphique pour les hommesfig_men <-plot_ly(df_men, x =~DIPLOM, y =~proportion, color =~quartile_distance, type ="bar",text =~paste(DIPLOM_label, "<br>", round(proportion*100, 1), "%"), # Affichage du libellé et proportiontextposition ="inside") %>%layout(title ="Proportion de score_scale par niveau de diplôme (Hommes)",xaxis =list(title ="Niveau de diplôme"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survol# Graphique pour les femmesfig_women <-plot_ly(df_women, x =~DIPLOM, y =~proportion, color =~quartile_distance, type ="bar",text =~paste(DIPLOM_label, "<br>", round(proportion*100, 1), "%"), # Affichage du libellé et proportiontextposition ="inside") %>%layout(title ="Proportion de score_scale par niveau de diplôme (Femmes)",xaxis =list(title ="Niveau de diplôme"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survol# Afficher les deux graphiques séparésfig_men
code R
fig_women
code R
library(dplyr)library(ggplot2)library(plotly)# Création des quartiles de distance_abs_2my_data_frame <- my_data_frame %>%mutate(quartile_distance =cut(distance_abs_2, breaks =quantile(distance_abs_2, probs =c(0, 0.25, 0.5, 0.75, 1), na.rm =TRUE), include.lowest =TRUE, labels =c("Q1", "Q2", "Q3", "Q4"))) # Étiquettes des quartilestable(my_data_frame$quartile_distance) # Vérification
Q1 Q2 Q3 Q4
2309 2308 2308 2309
code R
# Calcul des proportions correctes par satisfaction (A2)df_proportions <- my_data_frame %>%group_by(Santé, quartile_distance) %>%summarise(count =n(), .groups ="drop") %>%group_by(Santé) %>%# Normalisation par A2 et non par quartile_distancemutate(proportion = count /sum(count)) # Graphique interactif avec Plotly (barres empilées)fig <-plot_ly(df_proportions, x =~Santé, y =~proportion, color =~quartile_distance, type ="bar",text =~paste0(round(proportion *100, 1), "%"), textposition ="inside") %>%layout(title ="Proportion de distance aux normes par état de Santé",xaxis =list(title ="Santé"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack") # Empilement des barres pour que chaque A2 fasse 100%fig
code R
# Créer un tableau de contingencecontingency_table <-table(my_data_frame$Santé, my_data_frame$quartile_distance)# Test du chi-deuxchi2_test <-chisq.test(contingency_table)
1.5 Comparaison des modèles (Suite)
code R
my_data_frame$Sex <-as.factor(my_data_frame$Sex)# Modèle avec 'identity'model_identity <-glm(Sex ~ identity, data = my_data_frame, family = binomial)# Modèle avec 'score'model_score <-glm(Sex ~ score, data = my_data_frame, family = binomial)# Comparer les modèles via les critères AIC (Akaike Information Criterion)aic_identity <-AIC(model_identity)aic_score <-AIC(model_score)# Comparer les modèles via la deviancedeviance_identity <-deviance(model_identity)deviance_score <-deviance(model_score)# Résumé des modèlessummary(model_identity)
Call:
glm(formula = Sex ~ identity, family = binomial, data = my_data_frame)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 3.00930 0.08534 35.26 <2e-16 ***
identity -7.59704 0.22373 -33.96 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 12711 on 9233 degrees of freedom
Residual deviance: 11162 on 9232 degrees of freedom
AIC: 11166
Number of Fisher Scoring iterations: 4
code R
summary(model_score)
Call:
glm(formula = Sex ~ score, family = binomial, data = my_data_frame)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.58503 0.03010 -19.43 <2e-16 ***
score 1.04195 0.02254 46.22 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 12711.2 on 9233 degrees of freedom
Residual deviance: 8323.5 on 9232 degrees of freedom
AIC: 8327.5
Number of Fisher Scoring iterations: 5
code R
# Affichage des AIC et deviancecat("AIC for model with 'identity':", aic_identity, "\n")
AIC for model with 'identity': 11166.46
code R
cat("AIC for model with 'score':", aic_score, "\n")
AIC for model with 'score': 8327.457
code R
cat("Deviance for model with 'identity':", deviance_identity, "\n")
Deviance for model with 'identity': 11162.46
code R
cat("Deviance for model with 'score':", deviance_score, "\n")
Deviance for model with 'score': 8323.457
code R
library(pROC)# Calculer la probabilité prédite pour chaque modèleprob_identity <-predict(model_identity, type ="response")prob_score <-predict(model_score, type ="response")# Calculer la courbe ROC et AUC pour chaque modèleroc_identity <-roc(my_data_frame$Sex, prob_identity)roc_score <-roc(my_data_frame$Sex, prob_score)# Afficher les résultats AUCcat("AUC for model with 'identity':", auc(roc_identity), "\n")
AUC for model with 'identity': 0.7242187
code R
cat("AUC for model with 'score':", auc(roc_score), "\n")
AUC for model with 'score': 0.8676684
code R
# Tracer les courbes ROCplot(roc_identity, col ="blue", main ="Courbes ROC pour 'identity' et 'score'")plot(roc_score, col ="red", add =TRUE)legend("bottomright", legend =c("identity", "score"), col =c("blue", "red"), lwd =2)
code R
# Convertir satisfaction en numériquemy_data_frame <- my_data_frame %>%mutate(satisfaction_numeric =case_when( satisfaction =="Low"~1, satisfaction =="Medium"~2, satisfaction =="High"~3,TRUE~NA_real_# Gérer les valeurs manquantes si nécessaire ))# Vérifier la conversiontable(my_data_frame$satisfaction_numeric)
1 2 3
3503 2605 3117
code R
# Test de corrélation de Spearman entre satisfaction (ordinale) et distance_quartile (continue)cor.test(my_data_frame$satisfaction_numeric, my_data_frame$distance_abs_2, method ="spearman")
Spearman's rank correlation rho
data: my_data_frame$satisfaction_numeric and my_data_frame$distance_abs_2
S = 1.3324e+11, p-value = 0.07856
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.01831584
code R
# Convertir 'santé' en numérique (Good = 1, Fair = 2, Poor = 3)my_data_frame <- my_data_frame %>%mutate(santé_numeric =case_when( Santé =="Good"~1, Santé =="Fair"~2, Santé =="Poor"~3,TRUE~NA_real_ ))# Test de corrélation de Spearman entre santé (ordinale) et distance_abs_2cor.test(my_data_frame$santé_numeric, my_data_frame$distance_abs_2, method ="spearman")
Spearman's rank correlation rho
data: my_data_frame$santé_numeric and my_data_frame$distance_abs_2
S = 1.2994e+11, p-value = 0.6901
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.004159822
Call:
polr(formula = satisfaction ~ distance_abs_2, data = my_data_frame,
method = "logistic")
Coefficients:
Value Std. Error t value
distance_abs_2 0.02273 0.03199 0.7105
Intercepts:
Value Std. Error t value
High|Low -0.6543 0.0340 -19.2524
Low|Medium 0.9511 0.0348 27.3139
Residual Deviance: 20135.53
AIC: 20141.53
(9 observations effacées parce que manquantes)
1.6 Sexe ou Genre pour prédire la Satisfaction ?
code R
# Convertir les variables en facteurs si nécessairemy_data_frame$DIPLOM <-as.factor(my_data_frame$DIPLOM)my_data_frame$Sex <-as.factor(my_data_frame$Sex)my_data_frame$CLASSIF <-as.factor(my_data_frame$CLASSIF)my_data_frame$revenu <-as.factor(my_data_frame$revenu)my_data_frame$Santé <-as.factor(my_data_frame$Santé)my_data_frame$satisfaction <-as.factor(my_data_frame$satisfaction)my_data_frame$SITUA <-as.factor(my_data_frame$SITUA)my_data_frame$CS2D <-as.factor(my_data_frame$CS2D)# Créer une fonction pour comparer les modèles avec 'score' et 'Sex' comme prédicteurscompare_models <-function(variable) {# Affichage de la variable actuellement traitéecat("Traitement de la variable :", variable, "\n")# Modèle avec score comme prédicteur model_score <-polr(as.formula(paste(variable, "~ score_normalise_2")), data = my_data_frame, method ="logistic")# Modèle avec sexe comme prédicteur model_sex <-polr(as.formula(paste(variable, "~ Sex")), data = my_data_frame, method ="logistic")# Comparer l'AIC des deux modèles aic_score <-AIC(model_score) aic_sex <-AIC(model_sex)# Comparer et retourner le meilleur modèleif (aic_score < aic_sex) {return(data.frame(variable = variable, best_predictor ="Score", AIC_score = aic_score, AIC_sex = aic_sex)) } else {return(data.frame(variable = variable, best_predictor ="Sex", AIC_score = aic_score, AIC_sex = aic_sex)) }}# Liste des variables d'intérêt à analyservariables <-c("DIPLOM", "CLASSIF", "SITUA", "satisfaction", "Santé", "revenu", "CS2D")# Appliquer la fonction pour chaque variable d'intérêt et combiner les résultatsresults <-do.call(rbind, lapply(variables, compare_models))
Traitement de la variable : DIPLOM
Traitement de la variable : CLASSIF
Traitement de la variable : SITUA
Traitement de la variable : satisfaction
Traitement de la variable : Santé
Traitement de la variable : revenu
Traitement de la variable : CS2D
code R
# Afficher les résultats sous forme de tableauprint(results)
variable best_predictor AIC_score AIC_sex
1 DIPLOM Score 41875.234 41877.259
2 CLASSIF Sex 9541.198 9303.852
3 SITUA Sex 24323.188 24316.900
4 satisfaction Sex 20141.821 20141.519
5 Santé Sex 14570.078 14563.140
6 revenu Sex 19741.506 19729.137
7 CS2D Score 29090.088 29114.292
1.7 Genre et Professions
code R
library(readxl)my_data_frame$CS2D<-as.numeric(my_data_frame$CS2D)Listes_professions <-read_excel("professions.xls")mapping_codes_libelles <- Listes_professions[, c("Code", "Libelle")]my_data_frame <- my_data_frame %>%left_join(mapping_codes_libelles, by =c("CS2D"="Code")) %>%mutate(CS2D = Libelle)# Charger la bibliothèque dplyr pour manipuler les donnéeslibrary(dplyr)head(my_data_frame$CS2D)
[1] "Chefs d'entreprise de 10 salariés ou plus"
[2] NA
[3] "Agriculteurs sur petite exploitation"
[4] NA
[5] NA
[6] NA
code R
summary(my_data_frame$CS2D)
Length Class Mode
9234 character character
code R
# Compter les occurrences des professionsprofession_counts <-table(my_data_frame$CS2D)# Trier les professions par fréquence, du plus grand au plus petitprofession_counts_sorted <-sort(profession_counts, decreasing =TRUE)# Sélectionner les 10 professions les plus représentéestop_10_professions <-head(profession_counts_sorted, 10)# Afficher les 10 professions les plus représentéestop_10_professions
Artisans
332
Professions libérales
228
Commerçants et assimilés
219
Agriculteurs sur moyenne exploitation
144
Chefs d'entreprise de 10 salariés ou plus
111
Agriculteurs sur petite exploitation
105
Professeurs, professions scientifiques
90
Professions de l'information, des arts et des spectacles
88
Agriculteurs sur grande exploitation
79
Cadres de la fonction publique
74
code R
# Filtrer les données pour ne garder que les 10 professions les plus représentéestop_10_data <- my_data_frame[my_data_frame$CS2D %in%names(top_10_professions), ]# Créer un tableau de proportionstop_10_data <- my_data_frame %>%group_by(Sex, CS2D, quartile_distance, score_normalise_2, distance_abs_2, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(Sex, CS2D) %>%mutate(proportion = count /sum(count)) # Calcul de la proportion# Séparer les données en deux sous-ensembles (Hommes et Femmes)df_men <- top_10_data %>%filter(Sex =="Men")df_women <- top_10_data %>%filter(Sex =="Women")# Graphique pour les hommesfig_men <-plot_ly(df_men, x =~CS2D, y =~proportion, color =~quartile_distance, type ="bar",# Affichage du libellé et proportiontextposition ="inside") %>%layout(title ="Proportion de score_scale par niveau de diplôme (Hommes)",xaxis =list(title ="profession"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survol# Graphique pour les femmesfig_women <-plot_ly(df_women, x =~CS2D, y =~proportion, color =~quartile_distance, type ="bar",textposition ="inside") %>%layout(title ="Proportion de score_scale par profession (Femmes)",xaxis =list(title ="Profession"),yaxis =list(title ="Proportion", tickformat ="%"),barmode ="stack", # Empilement des barreshovermode ="closest") # Afficher les informations les plus proches du survol# Afficher les deux graphiques séparésfig_men
code R
fig_women
code R
library(dplyr)library(ggplot2)library(tidyr)# Vérifier que CS2D et Sex sont bien des facteurstop_10_data$CS2D <-as.factor(top_10_data$CS2D)top_10_data$Sex <-as.factor(top_10_data$Sex)# Calcul du score moyen par professionscore_summary <- top_10_data %>%group_by(CS2D) %>%summarise(score_moyen =mean(score_normalise_2, na.rm =TRUE))# Calcul des proportions Homme/Femme par professionsex_distribution <- top_10_data %>%group_by(CS2D, Sex) %>%summarise(n =n(), .groups ="drop") %>%group_by(CS2D) %>%mutate(proportion = n /sum(n))# Fusionner les deux datasetssummary_data <-left_join(score_summary, sex_distribution, by ="CS2D")# Visualisation combinéeggplot(summary_data, aes(x =reorder(CS2D, score_moyen))) +geom_col(aes(y = score_moyen), fill ="blue", alpha =0.6) +geom_point(aes(y = proportion *max(score_moyen), color = Sex), size =4) +scale_y_continuous(sec.axis =sec_axis(~./max(score_summary$score_moyen), name ="Proportion H/F") ) +labs(title ="Score moyen et proportion H/F par profession",x ="Profession (CS2D)", y ="Score normalisé moyen") +coord_flip() +theme_minimal()
code R
library(dplyr)library(ggplot2)library(tidyr)# Vérifier que CS2D et Sex sont bien des facteurstop_10_data$CS2D <-as.factor(top_10_data$CS2D)top_10_data$Sex <-as.factor(top_10_data$Sex)# Calcul du score moyen par professiondistance_summary <- top_10_data %>%group_by(CS2D) %>%summarise(distance_moyenne =mean(distance_abs_2, na.rm =TRUE))# Calcul des proportions Homme/Femme par professionsex_distribution <- top_10_data %>%group_by(CS2D, Sex) %>%summarise(n =n(), .groups ="drop") %>%group_by(CS2D) %>%mutate(proportion = n /sum(n))# Fusionner les deux datasetssummary_data <-left_join(distance_summary, sex_distribution, by ="CS2D")# Visualisation combinéeggplot(summary_data, aes(x =reorder(CS2D, distance_moyenne))) +geom_col(aes(y = distance_moyenne), fill ="blue", alpha =0.6) +geom_point(aes(y = proportion *max(distance_moyenne), color = Sex), size =4) +scale_y_continuous(sec.axis =sec_axis(~./max(distance_summary$distance_moyenne), name ="Proportion H/F") ) +labs(title ="Distance moyenne et proportion H/F par profession",x ="Profession (CS2D)", y ="Distance moyenne") +coord_flip() +theme_minimal()
code R
library(dplyr)library(ggplot2)# Vérifier que CS2D et Sex sont bien des facteurstop_10_data$CS2D <-as.factor(top_10_data$CS2D)top_10_data$Sex <-as.factor(top_10_data$Sex)# Calcul de la distance moyenne par profession et par sexedistance_summary <- top_10_data %>%group_by(CS2D, Sex) %>%summarise(distance_moyenne =mean(distance_abs_2, na.rm =TRUE), .groups ="drop")# Visualisationp<-ggplot(distance_summary, aes(x =reorder(CS2D, distance_moyenne), y = distance_moyenne, fill = Sex)) +geom_col(position ="dodge") +labs(title ="Distance moyenne (score_distance) par profession et par sexe",x ="Profession (CS2D)", y ="Distance moyenne (score_distance)") +coord_flip() +theme_minimal()p_plotly<-ggplotly(p)p_plotly
code R
# Créer un tableau de proportionstop_10_data <- my_data_frame %>%group_by(Sex, CS2D, quartile_distance, score_normalise_2, distance_abs_2, score_scale) %>%summarise(count =n(), .groups ="drop") %>%group_by(Sex, CS2D) %>%mutate(proportion = count /sum(count)) # Calcul de la proportionlibrary(dplyr)library(ggplot2)library(tidyr)# Vérifier que CS2D, Sex et score_scale sont bien des facteurstop_10_data$CS2D <-as.factor(top_10_data$CS2D)top_10_data$Sex <-as.factor(top_10_data$Sex)top_10_data$score_scale <-as.factor(top_10_data$score_scale)# Calcul des proportions de score_scale par profession et sexescore_scale_distribution <- top_10_data %>%group_by(CS2D, Sex, score_scale) %>%summarise(n =n(), .groups ="drop") %>%group_by(CS2D, Sex) %>%mutate(proportion = n /sum(n))# Visualisationggplot(score_scale_distribution, aes(x = score_scale, y = proportion, fill = Sex)) +geom_col(position ="dodge") +facet_wrap(~ CS2D) +labs(title ="Répartition de score_scale par profession et sexe",x ="Score Scale", y ="Proportion") +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1))
code R
top_10_data$CS2D <-as.factor(top_10_data$CS2D)top_10_data$Sex <-as.factor(top_10_data$Sex)top_10_data$score_scale <-as.factor(top_10_data$score_scale)# Créer une version numérotée (1-10 + NA) pour affichage dans le graphiquetop_10_data$CS2D_numeric <-as.numeric(top_10_data$CS2D)# Calcul des proportions de score_scale par profession et sexescore_scale_distribution <- top_10_data %>%group_by(CS2D_numeric, CS2D, Sex, score_scale) %>%summarise(n =n(), .groups ="drop") %>%group_by(CS2D_numeric, CS2D, Sex) %>%mutate(proportion = n /sum(n))# Graphique ggplotp <-ggplot(score_scale_distribution, aes(x = score_scale, y = proportion, fill = Sex, text =paste("Profession :", CS2D))) +geom_col(position ="dodge") +facet_wrap(~ CS2D_numeric) +# Garde les professions sous forme de codeslabs(title ="Répartition de score_scale par profession et sexe",x ="Score Scale", y ="Proportion") +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1))# Convertir en ggplotly avec tooltip interactifggplotly(p, tooltip ="text")
code R
# Créer une version numérotée (1-10 + NA) pour affichage dans le graphiquetop_10_data$CS2D_numeric <-as.numeric(top_10_data$CS2D)# Calcul des proportions de score_scale par profession et sexescore_scale_distribution <- top_10_data %>%group_by(CS2D_numeric, CS2D, Sex, score_scale) %>%summarise(n =n(), .groups ="drop") %>%group_by(CS2D_numeric, CS2D, Sex) %>%mutate(proportion = n /sum(n) *100) # Conversion en pourcentage# Graphique ggplotp <-ggplot(score_scale_distribution, aes(x = score_scale, y = proportion, fill = Sex, text =paste("Profession :", CS2D, "<br>","Sexe :", Sex, "<br>","Proportion :", round(proportion, 1), "%"))) +geom_col(position ="dodge") +facet_wrap(~ CS2D_numeric) +# Garde les professions sous forme de codeslabs(title ="Répartition de score_scale par profession et sexe",x ="Score Scale", y ="Proportion (%)") +theme_minimal() +theme(axis.text.x =element_text(angle =45, hjust =1))# Convertir en ggplotly avec tooltip interactifggplotly(p, tooltip ="text")